<?php
namespace ZyucMini\Core;

/**
 * 请求类 - 负责HTTP请求管理
 * 用于处理HTTP请求，获取请求参数等
 * 
 * @package ZyucMini\Core
 * @author 黄凯
 */
class Request
{
    /**
     * 获取请求方法
     * @return string
     */
    public function getMethod()
    {
        return $_SERVER['REQUEST_METHOD'] ?? 'GET';
    }

    /**
     * 判断是否是GET请求
     * @return bool
     */
    public function isGet()
    {
        return $this->getMethod() === 'GET';
    }

    /**
     * 判断是否是POST请求
     * @return bool
     */
    public function isPost()
    {
        return $this->getMethod() === 'POST';
    }

    /**
     * 判断是否是PUT请求
     * @return bool
     */
    public function isPut()
    {
        return $this->getMethod() === 'PUT';
    }

    /**
     * 判断是否是DELETE请求
     * @return bool
     */
    public function isDelete()
    {
        return $this->getMethod() === 'DELETE';
    }

    /**
     * 判断是否是PATCH请求
     * @return bool
     */
    public function isPatch()
    {
        return $this->getMethod() === 'PATCH';
    }

    /**
     * 判断是否是OPTIONS请求
     * @return bool
     */
    public function isOptions()
    {
        return $this->getMethod() === 'OPTIONS';
    }

    /**
     * 获取请求参数
     * @param string $key 参数名
     * @param mixed $default 默认值
     * @return mixed
     */
    public function get($key, $default = null)
    {
        $value = $_GET[$key] ?? $_POST[$key] ?? $default;
        return $this->filter($value);
    }

    /**
     * 获取GET参数
     * @param string $key 参数名
     * @param mixed $default 默认值
     * @return mixed
     */
    public function getParam($key, $default = null)
    {
        $value = $_GET[$key] ?? $default;
        return $this->filter($value);
    }

    /**
     * 获取POST参数
     * @param string $key 参数名
     * @param mixed $default 默认值
     * @return mixed
     */
    public function postParam($key, $default = null)
    {
        $value = $_POST[$key] ?? $default;
        return $this->filter($value);
    }

    /**
     * 获取所有请求参数
     * @return array
     */
    public function all()
    {
        $params = $this->isGet() ? $_GET : $_POST;
        return array_map([$this, 'filter'], $params);
    }

    /**
     * 获取所有GET参数
     * @return array
     */
    public function allGet()
    {
        return array_map([$this, 'filter'], $_GET);
    }

    /**
     * 获取所有POST参数
     * @return array
     */
    public function allPost()
    {
        return array_map([$this, 'filter'], $_POST);
    }

    /**
     * 安全过滤
     * @param mixed $value 要过滤的值
     * @return mixed
     */
    protected function filter($value)
    {
        if (is_array($value)) {
            return array_map([$this, 'filter'], $value);
        }
        
        return is_string($value) ? htmlspecialchars($value, ENT_QUOTES, 'UTF-8') : $value;
    }

    /**
     * 获取原始输入数据
     * @return string
     */
    public function getRawInput()
    {
        return file_get_contents('php://input');
    }

    /**
     * 获取JSON格式的输入数据
     * @param bool $assoc 是否返回关联数组
     * @return mixed
     */
    public function getJson($assoc = false)
    {
        $raw = $this->getRawInput();
        $data = json_decode($raw, $assoc);
        
        if (json_last_error() !== JSON_ERROR_NONE) {
            throw new \InvalidArgumentException('Invalid JSON: ' . json_last_error_msg());
        }
        
        return $data;
    }

    /**
     * 获取请求头
     * @param string $name 请求头名称
     * @param string|null $default 默认值
     * @return string|null
     */
    public function getHeader($name, $default = null)
    {
        $name = strtoupper(str_replace('-', '_', $name));
        $headerName = 'HTTP_' . $name;
        
        return $_SERVER[$headerName] ?? $default;
    }

    /**
     * 获取所有请求头
     * @return array
     */
    public function getAllHeaders()
    {
        $headers = [];
        foreach ($_SERVER as $key => $value) {
            if (strpos($key, 'HTTP_') === 0) {
                $headerName = str_replace('_', '-', substr($key, 5));
                $headers[$headerName] = $value;
            }
        }
        return $headers;
    }

    /**
     * 获取请求URI
     * @return string
     */
    public function getUri()
    {
        return $_SERVER['REQUEST_URI'] ?? '/';
    }

    /**
     * 获取请求路径
     * @return string
     */
    public function getPath()
    {
        $uri = $this->getUri();
        return parse_url($uri, PHP_URL_PATH) ?: '/';
    }

    /**
     * 获取查询字符串
     * @return string
     */
    public function getQueryString()
    {
        return $_SERVER['QUERY_STRING'] ?? '';
    }

    /**
     * 获取客户端IP地址
     * @return string
     */
    public function getClientIp()
    {
        $ipKeys = ['HTTP_X_FORWARDED_FOR', 'HTTP_X_REAL_IP', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'];
        
        foreach ($ipKeys as $key) {
            if (!empty($_SERVER[$key])) {
                $ip = $_SERVER[$key];
                // 处理多个IP的情况（如代理链）
                if (strpos($ip, ',') !== false) {
                    $ip = trim(explode(',', $ip)[0]);
                }
                if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
                    return $ip;
                }
            }
        }
        
        return $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
    }
}